package org.huawei260.String;

import java.util.ArrayDeque;
import java.util.Deque;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

/**
 * @author Fql18
 * @Auther: qingle
 * @Date: 2024/8/25-0:33
 * @Description:
 *
 * 已经火星人使用的运算符号为# $
 * 其与地球人的等价公式如下
 * x#y=2*x+3*y+4
 * x$y=3*x+y+2
 * x y是无符号整数
 * 地球人公式按照c语言规则进行计算
 * 火星人公式中$符优先级高于#相同的运算符按从左到右的顺序运算
 *
 * 输入描述
 * 火星人字符串表达式结尾不带回车换行
 * 输入的字符串说明是 字符串为仅有无符号整数和操作符组成的计算表达式
 *
 * 用例保证字符串中操作数与操作符之间没有任何分隔符
 * 用例保证操作数取值范围为32位无符号整数，
 * 保证输入以及计算结果不会出现整型溢出
 * 保证输入的字符串为合法的求值报文
 * 例如: 123#4$5#76$78
 * 保证不会出现非法的求值报文
 * 例如:
 * #4$5 这种缺少操作数
 * 4$5# 这种缺少操作数
 * 4#$5 这种缺少操作数
 * 4 $5 有空格
 * 3+4-5*6/7 有其他操作符
 * 12345678987654321$54321 32位整数溢出
 *
 * @version: 1.0
 */
public class O0044_火星文计算_AI_OK {
		public static void main(String[] args) {
			Scanner scanner = new Scanner(System.in);
			String expression = scanner.nextLine(); // 读取火星文表达式
			scanner.close();

			int result = evaluate(expression); // 计算结果
			System.out.println(result); // 输出结果
		}

		private static int evaluate(String expression) {
			// 定义操作符的优先级
			Map<Character, Integer> precedence = new HashMap<>();
			precedence.put('#', 1);
			precedence.put('$', 2);

			// 使用栈来处理操作数和操作符
			Deque<Integer> nums = new ArrayDeque<>();
			Deque<Character> ops = new ArrayDeque<>();

			for (int i = 0; i < expression.length(); i++) {
				char c = expression.charAt(i);
				if (Character.isDigit(c)) {
					int num = 0;
					// 处理多位数
					while (i < expression.length() && Character.isDigit(expression.charAt(i))) {
						num = num * 10 + (expression.charAt(i) - '0');
						i++;
					}
					nums.push(num); // 将数字压入操作数栈
					i--; // 调整索引，因为外层循环也会增加i
				} else if (c == '#' || c == '$') {
					// 处理操作符
					while (!ops.isEmpty() && precedence.get(ops.peek()) >= precedence.get(c)) {
						int b = nums.pop(); // 弹出右操作数
						int a = nums.pop(); // 弹出左操作数
						char op = ops.pop(); // 弹出操作符
						nums.push(calculate(a, b, op)); // 计算并将结果压入操作数栈
					}
					ops.push(c); // 将当前操作符压入操作符栈
				}
			}

			// 计算剩余的操作
			while (!ops.isEmpty()) {
				int b = nums.pop(); // 弹出右操作数
				int a = nums.pop(); // 弹出左操作数
				char op = ops.pop(); // 弹出操作符
				nums.push(calculate(a, b, op)); // 计算并将结果压入操作数栈
			}

			return nums.pop(); // 返回最终结果
		}

		private static int calculate(int a, int b, char op) {
			switch (op) {
				case '#':
					return 2 * a + 3 * b + 4; // 计算 x#y
				case '$':
					return 3 * a + b + 2; // 计算 x$y
				default:
					throw new IllegalArgumentException("Invalid operator: " + op);
			}
		}
	}